#ifndef ERROR_LOG_H
#define ERROR_LOG_H

#include "baselog.h"

/**
 * @brief 错误日志类
 *
 * 继承自日志基类BaseLog，专门用于记录系统错误相关信息，
 * 在基类基础上扩展了错误详情和错误位置属性，适用于系统异常跟踪，
 * 支持Qt元对象系统和QML界面绑定。
 */
class ErrorLog : public BaseLog
{
    Q_OBJECT

    /**
     * @brief 错误详情
     * 记录错误的具体描述信息，包括错误原因、堆栈信息等，支持QML绑定
     */
    Q_PROPERTY(QString error_detail READ get_error_detail WRITE set_error_detail NOTIFY error_detail_changed)

    /**
     * @brief 错误位置
     * 记录错误发生的位置信息（如类名、函数名、行号），支持QML绑定
     */
    Q_PROPERTY(QString error_location READ get_error_location WRITE set_error_location NOTIFY error_location_changed)

public:
    /**
     * @brief 无参构造函数
     * @param parent 父对象指针，用于Qt对象树管理
     */
    explicit ErrorLog(QObject *parent = nullptr)
        : BaseLog(parent) {}

    /**
     * @brief 带参构造函数
     * @param oper_user 操作人名称（继承自基类）
     * @param oper_time 操作时间字符串（继承自基类）
     * @param oper_result 操作结果描述（继承自基类，通常为"失败"）
     * @param error_detail 错误详情描述
     * @param error_location 错误发生位置
     * @param parent 父对象指针，用于Qt对象树管理
     */
    explicit ErrorLog(const QString& oper_user, const QString& oper_time, const QString& oper_result,
                      const QString& error_detail, const QString& error_location, QObject *parent = nullptr)
        : BaseLog(oper_user, oper_time, oper_result, parent),
          m_error_detail(error_detail),
          m_error_location(error_location) {}

    // -------------------------- 特有属性Getter方法 --------------------------

    /**
     * @brief 获取错误详情
     * @return 错误的具体描述信息
     */
    QString get_error_detail() const { return m_error_detail; }

    /**
     * @brief 获取错误位置
     * @return 错误发生的位置信息
     */
    QString get_error_location() const { return m_error_location; }

    // -------------------------- 特有属性Setter方法 --------------------------

    /**
     * @brief 设置错误详情
     * @param new_error_detail 新的错误详情描述
     * @note 当新值与旧值不同时，会发射error_detail_changed信号
     */
    void set_error_detail(const QString& new_error_detail) {
        if (m_error_detail != new_error_detail) {
            m_error_detail = new_error_detail;
            emit error_detail_changed(new_error_detail);
        }
    }

    /**
     * @brief 设置错误位置
     * @param new_error_location 新的错误发生位置
     * @note 当新值与旧值不同时，会发射error_location_changed信号
     */
    void set_error_location(const QString& new_error_location) {
        if (m_error_location != new_error_location) {
            m_error_location = new_error_location;
            emit error_location_changed(new_error_location);
        }
    }

signals:
    /**
     * @brief 错误详情变更信号
     * @param new_error_detail 变更后的错误详情
     */
    void error_detail_changed(const QString& new_error_detail);

    /**
     * @brief 错误位置变更信号
     * @param new_error_location 变更后的错误位置
     */
    void error_location_changed(const QString& new_error_location);

private:
    QString m_error_detail;   // 错误详情描述（如"数据库连接超时"）
    QString m_error_location; // 错误发生位置（如"DatabaseManager::connect:45"）
};

#endif // ERROR_LOG_H
